package Thread;
//模拟实现一个消息队列，完成put和take方法的实现；
//实线程消息队列的阻塞功能；
class MyBlockQueue{
    private String[] date=null;
    private int head=0;//队头；
    private int tail=0;//队尾；
    int size=0;//实际元素的个数；
    //创建构造方法；
    public MyBlockQueue(int capcity){
        date=new String[capcity];
    }
    //实现向消息队列中添加元素；
    public void put(String elem) {
        synchronized (this) {
            if (size >= date.length) {
                //队列空了，需要进行阻塞；
                return;
            }
            date[tail]=elem;
            tail++;
            if(tail>= date.length){
                tail=0;
            }
            size++;

        }
    }
    //删除消息队列中的元素；
    public String take(){
        synchronized (this) {
            if (size == 0) {
                //此时说明队列为，要进行阻塞等待了；
                return null;
            }
            String ret=date[head];
            head++;
            if(head>=date.length){
                head=0;
            }
            size--;
            return ret;
        }
       // return ret;
    }

}
public class Demo31 {
    public static void main(String[] args){
        MyBlockQueue myBlockQueue=new MyBlockQueue(20);
        Thread t1=new Thread(()->{
            int n=0;
            for(int i=0;i<20;i++){
                    System.out.println("生产者进行生产元素" + n);
                    myBlockQueue.put(n + "");
                    n++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Thread t2=new Thread(()->{
            String n=null;
            for(int i=0;i<20;i++) {
                 n = myBlockQueue.take();
                System.out.println("消费者进行获取元素" + n);
            }
        });
        t1.start();
        t2.start();
    }
}
